#ifndef NODE_MANAGER_H
#define NODE_MANAGER_H

#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/mobility-module.h"
#include "ns3/internet-module.h"
#include "data_manager.h"
#include <vector>
#include <map>

namespace ns3 {

/**
 * @brief 节点类型枚举
 */
enum class NodeType {
  VEHICLE,
  GROUND_STATION,
  SATELLITE
};

/**
 * @brief 节点管理器类，负责创建和管理节点
 */
class NodeManager 
{
public:
  /**
   * @brief 构造函数
   */
  NodeManager();
  
  /**
   * @brief 析构函数
   */
  ~NodeManager();
  
  /**
   * @brief 初始化节点管理器
   * @param dataManager 数据管理器引用
   * @return 初始化是否成功
   */
  bool Initialize(const DataManager& dataManager);
  
  /**
   * @brief 设置车辆节点
   * @param vehicleId 车辆ID
   * @return 设置是否成功
   */
  bool SetupVehicleNode(uint32_t vehicleId);
  
  /**
   * @brief 设置地面基站节点
   * @return 设置是否成功
   */
  bool SetupGroundStationNodes();
  
  /**
   * @brief 设置卫星节点
   * @return 设置是否成功
   */
  bool SetupSatelliteNodes();
  
  /**
   * @brief 安装Internet协议栈
   */
  void InstallInternetStack();
  
  /**
   * @brief 获取车辆节点
   * @return 车辆节点
   */
  Ptr<Node> GetVehicleNode() const;
  
  /**
   * @brief 获取地面基站节点
   * @param id 基站ID
   * @return 基站节点
   */
  Ptr<Node> GetGroundStationNode(uint32_t id) const;
  
  /**
   * @brief 获取卫星节点
   * @param id 卫星ID
   * @return 卫星节点
   */
  Ptr<Node> GetSatelliteNode(uint32_t id) const;
  
  /**
   * @brief 获取所有地面基站节点
   * @return 地面基站节点容器
   */
  NodeContainer GetGroundStationNodes() const;
  
  /**
   * @brief 获取所有卫星节点
   * @return 卫星节点容器
   */
  NodeContainer GetSatelliteNodes() const;
  
  /**
   * @brief 重置节点管理器
   */
  void Reset();

  /**
   * @brief 获取节点数量
   * @param type 节点类型
   * @return 指定类型的节点数量
   */
  uint32_t GetNodeCount(NodeType type) const;

private:
  /**
   * @brief 为车辆设置移动模型
   * @param node 车辆节点
   * @param vehicleData 车辆轨迹数据
   */
  void SetupVehicleMobility(Ptr<Node> node, const std::vector<VehicleData>& vehicleData);

private:
  const DataManager* m_dataManager;             ///< 数据管理器引用
  
  Ptr<Node> m_vehicleNode;                      ///< 当前车辆节点
  NodeContainer m_groundStationNodes;           ///< 地面基站节点容器
  NodeContainer m_satelliteNodes;               ///< 卫星节点容器
  
  std::map<uint32_t, Ptr<Node>> m_gsNodeMap;    ///< 基站ID到节点的映射
  std::map<uint32_t, Ptr<Node>> m_satNodeMap;   ///< 卫星ID到节点的映射
  
  InternetStackHelper m_internet;               ///< Internet协议栈助手
};

} // namespace ns3

#endif // NODE_MANAGER_H
